package com.哈希.练习题;

import java.util.*;


public class Leetcode819 {
    /**
     * 最常见的单词
     *
     * 给你一个字符串 paragraph 和一个表示禁用词的字符串数组 banned ，返回出现频率最高的非禁用词。题目数据 保证 至少存在一个非禁用词，且答案 唯一 。
     * paragraph 中的单词 不区分大小写 ，答案应以 小写 形式返回。
     * 注意 单词不包含标点符号。
     *
     * 示例 1：
     * 输入：paragraph = "Bob hit a ball, the hit BALL flew far after it was hit.", banned = ["hit"]
     * 输出："ball"
     * 解释：
     * "hit" 出现了 3 次，但它是禁用词。
     * "ball" 出现了两次（没有其他单词出现这么多次），因此它是段落中出现频率最高的非禁用词。
     * 请注意，段落中的单词不区分大小写，
     * 标点符号会被忽略（即使它们紧挨着单词，如 "ball,"），
     * 并且尽管 "hit" 出现的次数更多，但它不能作为答案，因为它是禁用词。
     */
    public String mostCommonWord(String paragraph, String[] banned) {
        Set<String> banSet = new HashSet<>(Arrays.asList(banned));
        HashMap<String,Integer> map = new HashMap<>();
        String[] split = paragraph.toLowerCase().split("[^A-Za-z]+");
        for (String key : split) {
            if(banSet.contains(key)){
                continue;
            }
            map.compute(key, (k, v) -> v == null ? 1 : v + 1);
        }
        Optional<Map.Entry<String, Integer>> optional = map.entrySet().stream().max(Map.Entry.comparingByValue());
        return optional.map(Map.Entry::getKey).orElse(null);

    }
}
